package redis

import (
	log "common/log4go"
	"common/redis"
	redisFmt "github.com/garyburd/redigo/redis"
)

func Init(cfg redis.Config) (err error) {
	err = redis.Init(cfg)
	if err != nil {
		return err
	}

	return nil
}
func Close() {
	redis.Close()
}

func RedisSet(key string, value string, expire int64) (err error) {
	if expire > 0 {
		_, err = redis.SETEX(key, value, expire)
		if err != nil {
			log.Error("redis.SETEX(%s,%s,%d) error(%v)", key, value, expire, err)
			return
		}

	} else {
		_, err = redis.SET(key, value)
		if err != nil {
			log.Error("redisDB.SET(%s, %s) error(%v)", key, value)
			return
		}
	}
	return
}

func RedisGet(key string) (data string, err error) {
	// 读取key
	buf, err := redis.GET(key)
	if err != nil {
		if err == redis.ErrNil {
			err = nil
			return
		}
		log.Error("redis.GET(%v) error(%v)", key, err)
		return "", err
	}
	data, err = redisFmt.String(buf, err)
	if err != nil {
		if err == redis.ErrNil {
			err = nil
			return
		}
		log.Error("redisFmt.String(%s) error(%v)", buf, err)
		return "", err
	}
	return data, nil
}

func RedisDelete(key string) (err error) {
	if _, err = redis.DEL(key); err != nil {
		log.Error("redis.DEL(%v) error(%v)", key, err)
		return
	}
	return
}

func RedisIncr(key string) (count int64, err error) {
	count, err = redis.INCR(key)
	if err != nil {
		log.Error("redis.INCR(%v) error(%v)", key, err)
		return
	}
	return
}

func RedisDecr(key string) (count int64, err error) {
	count, err = redis.DECR(key)
	if err != nil {
		log.Error("redis.DECR(%v) error(%v)", key, err)
		return
	}
	return
}

func RedisEXPIRE(key string, expire int64) (err error) {
	_, err = redis.EXPIRE(key, expire)
	if err != nil {
		log.Info("redis.EXPIRE(%s, %d) error(%v)", key, expire, err)
		return
	}
	return

}

func RedisHSet(key string, field string, value string) (err error) {
	_, err = redis.HSET(key, field, value)
	if err != nil {
		log.Error("redis.HSET(%s,%s,%d) error(%v)", key, field, value, err)
		return
	}

	return
}
func RedisHGet(key string, field string, value string) (data string, err error) {
	buf, err := redis.HGET(key, field)
	if err != nil {
		if err == redis.ErrNil {
			err = nil
			return
		}
		log.Error("redis.HGET(%s,%s) error(%v)", key, field, err)
		return "", err
	}
	data, err = redisFmt.String(buf, err)
	if err != nil {
		if err == redis.ErrNil {
			err = nil
			return
		}
		log.Error("redisFmt.String(%s) error(%v)", buf, err)
		return "", err
	}
	return data, nil
}
func RedisHDel(key string, field string) (err error) {
	_, err = redis.HDEL(key, field)
	if err != nil {
		log.Error("redis.HDEL(%s,%s,%d) error(%v)", key, field, err)
		return
	}
	return
}

func RedisRPush(key string, value string) (err error) {
	_, err = redis.RPUSH(key, value)
	if err != nil {
		log.Error("redis.RPUSH(%s,%s,%d) error(%v)", key, value, err)
		return
	}
	return
}
